package {
	import MLP.mlp_effectLayer;
	
	import SEApp.dialogs.se_friendsDialog;
	import SEApp.se_app;
	import SEApp.se_util;
	
	import UIFree.FX;
	import UIFree.ObjectEvent;
	import UIFree.controls.uif_label;
	import UIFree.uif_Timer;
	import UIFree.uif_ecomponent;
	import UIFree.uif_styles;
	import UIFree.uif_transition;
	
	import api.clt_myserver;
	import api.clt_okserver;
	import api.com.odnoklassniki.Odnoklassniki;
	import api.com.odnoklassniki.events.ApiCallbackEvent;
	import api.com.odnoklassniki.events.ApiServerEvent;
	import api.com.odnoklassniki.sdk.photos.Photos;
	import api.com.odnoklassniki.sdk.stream.Stream;
	
	import api_servers.api_server;
	
	import classes.clt_events;
	import classes.clt_locale;
	import classes.clt_plugins;
	import classes.clt_styles;
	
	import com.adobe.images.PNGEncoder;
	
	import components.banners.clt_photocache;
	import components.clt_albums;
	import components.clt_layer;
	import components.clt_userReview;
	import components.clt_victoryCollage;
	import components.clt_victoryWindow;
	import components.dialogs.clt_waitAlert;
	import components.game.clt_gameLayer;
	import components.game.clt_gameParams;
	import components.plugins.album.clt_addCollageAlbum;
	import components.plugins.album.clt_albumInitObject;
	import components.plugins.effects.clt_effectsInitObject;
	import components.plugins.facesearch.clt_facesearchInitObject;
	import components.plugins.frames.clt_framesInitObject;
	import components.plugins.mlp.clt_mlpInitObject;
	import components.plugins.search.clt_searchInitObject;
	
	import data.cd_clothing;
	import data.cd_defaults;
	import data.cd_utils;
	import data.clt_data;
	
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	import flash.utils.ByteArray;

	[SWF(width="760", height="1135", backgroundColor="#FFFFFF")]
	public class clothing_ok extends clt_clothingBase {
		public static const MEGA_PRICE: Number 			= 40;
		public static const DOUBLE_PRICE: Number 		= 100;
		public static const REPEATGAME_PRICE: Number 	= 30;
		public static const NOLINKTEXT_PRICE: Number 	= 30;
		public static const VIPSTATUS_PRICE: Number 	= 150;
		
		public static const SECRETS: Object = {
			'27436800': '9B8100B59CE3BF8D85AE464D',
			'6278400': '0C8FBEF24707763ECF000635',
			'CBAPNNABABABABABA': '8DCE8C8EE7F030A9E15F16D1',
			'34205952': '776438E5F15FA66D2912F3C2' // dev
		}
		
		public static const toDiskSize: Point = new Point(600, 600);
		public static const toAlbumSize: Point = new Point(480, 480); 
		public static const appSize: Point = new Point(760, 1135);
		public static const viewSize: Point = new Point(760, 1300);
		private var _vars				: Object;
		private var _friendsDialog		: se_friendsDialog;
		private var _selectAlbum		: clt_albums;
		private var _invitationCount	: uint;	
		private var _payCallBack		: Function;
		private var _argSex				: int;
		
		public static const APPLINK: String = 'http://odnoklassniki.ru/game/clothing';
		
		public function clothing_ok() {
			mlp_effectLayer.URLPATH = clt_servers.EFFECT_URL;
			super(appSize.x, appSize.y);
			okInit();
		}
		
		override protected function resetData(): void {
			for (var i:int=0; i<cd_clothing.groups.length; i++) {
				if (cd_clothing.groups[i].id == 1001) cd_clothing.groups.splice(i, 1);
			}
			super.resetData();
		}
		
		override protected function initialize(): void {
			new clt_effectsInitObject(this);
			new clt_framesInitObject(this);
			new clt_mlpInitObject(this);
			new clt_searchInitObject(this);
			
//			new clt_facesearchInitObject(this);
			
/*
			clt_servers.MAIN_URL 	= 'http://62.76.180.100';//'http://188.127.227.55';
			//			clt_servers.TMPL_URL 	= clt_servers.MAIN_URL;
			
			clt_servers.UPLOADJPG_SERVER 	= clt_servers.MAIN_URL;
			
			clt_servers.STIKERS_URL			= clt_servers.TMPL_URL + '/games/data/clothing/stikers/';
			clt_servers.HAIR_URL 			= clt_servers.TMPL_URL + '/games/data/clothing/hair/';
			clt_servers.MASK_URL 			= clt_servers.TMPL_URL + '/games/data/clothing/masks/';
			clt_servers.CLOTH_URL 			= clt_servers.TMPL_URL + '/games/data/clothing/cloth/';
			clt_servers.BACKGROUND_URL 		= clt_servers.TMPL_URL + '/games/data/clothing/background/';
			clt_servers.IMAGE_URL 			= clt_servers.MAIN_URL + '/games/data/clothing/images/';
			
			clt_servers.GAME_URL 			= clt_servers.MAIN_URL + '/games/data/clothing/game/';
			clt_servers.GAMEPREVIEW_URL 	= clt_servers.MAIN_URL + '/games/data/clothing/game/preview/';
			//			clt_servers.UPLOADJPG_SERVER 	= clt_servers.TMPL_URL;
			clt_servers.UPLOADJPG_URL 		= clt_servers.UPLOADJPG_SERVER + '/games/index.php';
			clt_servers.HEADSURL			= clt_servers.UPLOADJPG_SERVER + '/games/data/clothing/head_preview/';
*/			
			
			
			stage.scaleMode 	= StageScaleMode.NO_SCALE;
			stage.align 		= StageAlign.TOP_LEFT;
			
			_vars 			= flashVars;
//			_vars.logged_user_id = 164379718465;
			var a: Array 	= _vars.apiconnection.split('_');
			_vars.api_id 	= a[0];
			_vars.uid 		= _vars.logged_user_id;
/*			
			ForticomAPI.addEventListener(ForticomAPI.CONNECTED, apiIsReady);
			ForticomAPI.connection = _vars["apiconnection"];
			ForticomAPI.addEventListener(ApiCallbackEvent.CALL_BACK, handleApiEvent);*/

		}
		
		protected function okInit(): void {
			Odnoklassniki.initialize(this, SECRETS[_vars.api_id]);
			Odnoklassniki.addEventListener(ApiServerEvent.CONNECTED, onConnect);
			Odnoklassniki.addEventListener(ApiServerEvent.CONNECTION_ERROR, onErrorConnection);
			Odnoklassniki.addEventListener(ApiServerEvent.PROXY_NOT_RESPONDING, onErrorConnection);
			Odnoklassniki.addEventListener(ApiServerEvent.NOT_YET_CONNECTED, onErrorConnection);
			Odnoklassniki.addEventListener(ApiCallbackEvent.CALL_BACK, doCallBack);
			
			_invitationCount = 15;
			_argSex			 = -1;
			
			checkAppUsers();
/*			Friends.getAppUsers(function(a_data: Object): void {
				if (!checkErrorData(a_data))
					_invitationCount = a_data.uids.length;
			});*/
		}
		
		protected function checkAppUsers(): void {
			var WAIT: int = 3000;
			uif_Timer.one(WAIT, function(): void {
				if (externalServer) externalServer.getAppUsers(function(a_appUsers: Array): void {
					uif_Timer.one(WAIT, function(): void {
						externalServer.getAllFriends(externalServer.viewer_id, function(a_users: Array): void {
							appNotUsers(a_users.filter(function(user: Object, i: int, arr: Array): Boolean {
								return a_appUsers.indexOf(user.uid) == -1;
							}));
						})
					});
				});				
			});
			
		}
		
		protected function appNotUsers(a_users: Array): void {
			if (a_users.length > 0) showNoAppUser(a_users[Math.floor(Math.random() * a_users.length)]);
		}
		
		protected function showNoAppUser(a_user: Object): void {
			var _user: clt_userReview = new clt_userReview(dialogLayer, 80);
			_user.setUser(a_user);
/*			_user.x = -90;
			(new FX(function(delta: Number): void {
				_user.position = new Point(delta * 180 - 150, 180);
			}, uif_transition.easeInOut(uif_transition.Bounce, 4), 16, 2000)).start();*/
		}
		
		protected function doCallBack(event: ApiCallbackEvent): void {
			if ((event.method == 'showPayment') && (event.result == 'ok')) {
				if (_payCallBack != null) _payCallBack(event);
				userMyDataRefresh();
				workspace.dispatchEvent(new Event(clt_events.UPDATEGAME));
				_payCallBack = null;
			} else if ((event.method == 'showConfirmation') && (event.result == 'ok')) {
			}/* else if ((event.method == 'showInvite') && (event.result == 'cancel')) {
			}*/
		}
		
		protected function superInitialize(): void {
			super.initialize();
		}
		
		override protected function updateScaleFromStage():void {
			super.updateScaleFromStage();
			Odnoklassniki.setWindowSize(viewSize.x, viewSize.y);
		}
		
		protected function onConnect(event : ApiServerEvent) : void {
			updateScaleFromStage();
			superInitialize();
			workspace.addEventListener(clt_events.VOTEMEGA, doVoteMega); 
			workspace.addEventListener(clt_events.VOTE2, doVoteDouble);
			workspace.addEventListener(clt_events.NEWVICTORY, doNewVictory);
			workspace.addEventListener(clt_events.AFTERADDVOTE, doAfterAddVote);
			addEventListener(clt_events.INVITEDIALOGSHOW, doInviteShow);
			new clt_gameLayer(layers[0], clt_layer.ALIGNTOP);
			
/*			
			var errorBlock: clt_layer = new clt_layer(layers[0], 200, clt_layer.ALIGNTOP, 'block');
			var inner: Rectangle = errorBlock.getInner();
			var errorText: uif_label = new uif_label(errorBlock, inner.x, inner.y, inner.width, inner.height, 'block-title');
			errorText.text = 'По техническим причинам конкурс временно недоступен. Приносим извинения за доставленные неудобства';
*/			
			
			if (_vars.custom_args)
				customArgs(_vars.custom_args)
		}
		
		override protected function getRunArea(): Rectangle {
			return getInner();
		}
		
		protected function customArgs(args: Object): void {
			if (uint(args) > 0) collageView(uint(args));
			else {
				args = args.split(',');
				if (args[0] == 'cid') {
					var cloth: Object = cd_utils.fromID(cd_clothing.list, args[1]);
					if (cloth) {
						_argSex 							= (cloth.group==2)?0:((cloth.group==1)?1:cloth.group-1);
						cd_defaults.cloth[_argSex].id 		= cloth.id;
						cd_defaults.cloth[_argSex].group 	= cloth.group;
						addEventListener(se_app.UPDATEUSER, function(e: Event): void {
							user.templateSex = _argSex;
						});
					}
				}
			}
		}
		
		public function checkErrorData(a_data: Object): Boolean {
			function errorEvent(): void {
				switch (a_data.error_code) {
					case 10: alert(locale.ERROR, sitedata.NOUSERALBUMACCESS, showInviteDialog);
							break;
					default: alert(locale.ERROR, a_data.error_msg);
				}
			}
		
			
			if (!a_data) {
				alert(locale.ERROR, sitedata.EMPTYRESULT);
				return true;
			} else if (a_data.hasOwnProperty('error_code')) {
				errorEvent();
				return true;
			}
			return false;
		}
		
		override protected function queryUserData(postFunc: Function): void {
			externalServer.getProfiles(externalServer.viewer_id, function(a_data: Object): void {
				postFunc(a_data[0]);
				sitedata.POSTTEXTGAME = Utils.sprintf(sitedata.POSTTEXTGAME, [se_util.userName(user), (user.sex==0)?'':'а'])				
			})
		}
		
		protected function onErrorConnection(event : ApiServerEvent) : void {
			alert(locale.MESSAGE, event.type);
		}
		
		override protected function initSiteData(): Object {
			return {
				STARTDESCRIPTION	: '<font size="22">Всего лишь %s приложение!</font>\n' + locale.INVITEDETAIL,
				NOUSERALBUMACCESS	: 'Нет доступа к альбомам пользователя, приложение не установлено.\nПригласите друга для получения доступа к альбомам.',
				NOACCESSPHOTOS		: 'Нет доступа к вашим фотографиям!\nВы хотите открыть доступ к фотографиям для приложения?',
				NOALBUMS			: 'Нет доступных альбомов',
				POSTTITLE			: 'Новый коллаж',
				POSTTEXTGAME		: '%s1 отправил%s2 свое творение на конкурс, ВЫРУЧАЙ, помоги голосами!',
				VOTEDOUBLEHELP		: 'Удваивает поступившие голоса для этого коллажа в течении суток с момента активации. Стоимость сервиса: <font color="#FF0000">' + DOUBLE_PRICE + ' ОКов</font>',
				VOTEMEGAHELP1		: 'Поставьте максимальную, МЕГА оценку!',
				VOTEMEGAHELP2		: 'Вы получите возможность ставить максимальную оценку в течении суток с момента активации. Стоимость сервиса: <font color="#FF0000">' + MEGA_PRICE + ' ОКов</font>',
				VOTEDOUBLETEXT		: '<font size="16" color="#FF0000">Голоса за ваш коллаж будут умножаться на два!</font> Если вы воспользуетесь специальной услугой: <b>"Удваивание голосов в течении суток"</b> всего за ' + DOUBLE_PRICE + ' ОКов. Ваш коллаж получит больше голосов и вы станете еще более знаменитым. Хотите воспользоваться услугой?',
				TITLEVICTORY		: 'Победа!',
				TEXTVICTORY			: 'Я победитель в конкурсе перевоплощений! Мой коллаж признан лучшим за %s',
				EMPTYGAME			: 'Коллаж удален автором или конкурс окончен',
				EMPTYRESULT			: 'Пустой результат',
				INVITEDESC			: 'Приглашение в приложение "' + locale.APPNAME + '"',
				PAYDOUBLETITLE		: 'Удваивание получаемых оценок в течении суток',
				PAYMEGATITLE		: 'Возможность ставить МЕГА оценки в течении суток',
				VICTORYTITLE		: 'Победа!',
				VICTORYDESC			: '<b>Поздравляем!</b> Вы победили в конкурсе на лучший коллаж, за сутки ваш коллаж набрал максимальное количество голосов.',
				REPEATGAMEDESC		: 'Сегодня ваш коллаж уже участвует в конкурсе, повторное участие стоит ' + REPEATGAME_PRICE + ' ОКов. Вы уверены что хотите отправить ваш новый коллаж для участия в конкурсе и при этом ваш счет уменьшиться на ' + REPEATGAME_PRICE + ' ОК?',
				REPEATGAMEPAY		: 'Повторное участие в конкурсе',
				TEXTFROMRESULT		: APPLINK,
				NOLINKTEXTDESC		: 'Всего за ' + NOLINKTEXT_PRICE + 
											' ОК вы сможете избавится от надписи <b>НАВСЕГДА</b>!\nВы согласны убрать надпись?',
				NOTEXTLINKPAYDESC	: 'коллаж без надписи навсегда!',
				BANDESCR			: 'Ваша жалоба принята и будет рассмотрена в ближайшее время',
				MYBUTTONCAPTION		: 'Мне',
				GAMESTREAM			: 'Оцените мой коллаж, помогите с оценками в конкурсе!',
				SAIDBUTTONHINT		: 'Показать друзьям этот коллаж',
				SAIDCOLLAGETITLE	: 'Обратите внимание',
				SAIDCOLLAGEDESCR	: 'Этот коллаж очень хорош, оцените и голосуйте за него!',
				NOBANSET			: 'На коллаж можно пожаловаться только в период действия конкурса',
				
				VIPSTATUSPREF1		: '<font color="#880000">Это действие доступно только для VIP-пользователей!</font>\nВы можете приобрести статус и получить следующие возможности:\n',
				VIPSTATUSPREF2		: '<font size="15px">Представляем вам новую услугу: <font color="#880000">VIP-статус!</font></font>\nVIP статус, дает следующие возможности:\n',
				VIPSTATUSINFO		: '\n1. Удаляет надпись-ссылку на приложение из коллажа\n2. Возможность ставить "МЕГА" оценку за любой коллаж\n3. Доступны все фильтры-эффекты для ваших коллажей\n4. Возможность добавлять стикер в коллаж на конкурсе\n5. Сохранение коллажей без ограничений\n\nуслуга действует один месяц с начала активации.\nЦена услуги ' + VIPSTATUS_PRICE + ' ок.\nВы хотите принять предложение?',
//				VIPSTATUSINFO		: '\n1. Удаляет надпись-ссылку на приложение из коллажа\n2. Возможность ставить "МЕГА" оценку за любой коллаж\n3. Доступны все фильтры-эффекты для ваших коллажей\n4. Нет ограничений для участия в конкурсе\n5. Возможность добавлять стикер в коллаж на конкурсе\n6. Сохранение коллажей без ограничений\n\nуслуга действует один месяц с начала активации.\nЦена услуги ' + VIPSTATUS_PRICE + ' ок.\nВы хотите принять предложение?',
				VIPSTATUCPAY		: 'VIP статус',
				STIKERHINT			: 'VIP пользователи могут выбрать для своего коллажа стикер. Кликните на стикере что бы узнать как получить VIP статус.',
				EMPTYPICURL			: 'http://62.76.180.100/games/data/clothing/images/emtypicurl.jpg',
				REQUESTINVITE		: ', пригласи меня пожалуйста в приложение!\n',
				FRIENDGAMENOTIFY	: 'Ваш друг %s участвует в конкурсе на лучший коллаж дня!',
				MYALBUMNAME			: 'Прикольное перевоплощение ' + APPLINK,
				MYALBUMDESC			: 'Коллажи созданные в приложении "Прикольное перевоплощение", ' + APPLINK
			};
		}
		
		override public function get saveMenuList(): Array {
			return [
				{caption: clt_locale.SAVETOALBUM, method		: doToAlbum},
				{caption: clt_locale.SAVETODISK, method			: doToDisk},
				{caption: ' Только фигуру (PNG) ', method		: doToFilePNG},
				//{caption: ' В ленту активности ', method		: doToStream},
				{caption: clt_locale.SAVETOGAME, method			: doToGame},
				{caption: clt_locale.SAVETOMYALBUM, method		: toMyAlbumBmp}
			]
		}
		
/*		protected function doToFriendMessage(): void {
			function doFieldSelect(item: Object): void {
				internalServer.oneQuery('sendNotify', item.uid + ';' + sitedata.SIMPLENOTIFY, null, true);
				fd.close();
			}
			var fd: se_friendsDialog = new se_friendsDialog(topLayer);
			fd.showSelect(doFieldSelect);
		}*/
		
		override protected function doToGame(): void {
			if (checkGameCollage()) {
				var event: ObjectEvent = new ObjectEvent(clt_events.CHECKISGAME, {
					result: false
				})
				workspace.dispatchEvent(event);
				if (!event.object.result)// || user.vipStatus) // Если нет коллажа с участием текущего пользователя 
					toNewGame();
				else repeatGame();
			}
		}
		
		protected function waitToSave(byteFunc: Function, size: Point, encoder: Function, options: Object=null): void {
			function getByteArray(resultFunc: Function): void {
				getResult(size.x, size.y, function(result: BitmapData): void {
					resultFunc(encoder(result));
					result.dispose();
				}, options);
			}
			
			var ba: ByteArray;
			if (user.vipStatus || (_invitationCount >= app.classes.data.INVITECOUNT)) {
				getByteArray(byteFunc);
			} else { 
				var waitSec: uint = Math.ceil(app.classes.data.WAITSECCOUNT * (1 - _invitationCount/app.classes.data.INVITECOUNT));
				
				var dlg: clt_waitAlert = new clt_waitAlert(dialogLayer, locale.SAVEDESCRIPTION, waitSec, clt_photocache, function(): void {
					dispatchEvent(new Event(clt_events.INVITEDIALOGSHOW));
				}, function(): void {
					if (ba) byteFunc(ba);
					dlg.close();
				});
				dlg.show(function(): void {
					ba = getByteArray();
				});
			}
		}
		
		protected function doToDisk(): void {

			waitToSave(function(FileData: ByteArray): void {
				saveToFile(FileData, genFileNameCard(clt_data.JPGEXT));
			}, toDiskSize, encodeFromJPG, null);
		}
		
		protected function doToFilePNG(): void {
			waitToSave(function(FileData: ByteArray): void {
				saveToFile(FileData, genFileNameCard(clt_data.PNGEXT));
			}, toDiskSize, PNGEncoder.encode, {noback: true});
		}

		protected function selectAlbum(postFunc: Function): clt_albums {
			if (!_selectAlbum) _selectAlbum = new clt_albums(dialogLayer);
			_selectAlbum.showSelect(postFunc);
			return _selectAlbum;
		}
		
		override public function getCollageLink(collageData:Object):String {
			return APPLINK + '?' + collageData.id;
		}
		
		private function _toSelectedAlbum(album: Object, a_JPGData: ByteArray, collageObject: Object=null): void {
			var serverURL: String;
			function saveJPG(JPGData: ByteArray): void {
				Photos.upload([JPGData], function(a_data: Object): void {
					if (!checkErrorData(a_data)) { 
						alert(locale.MESSAGE, 'Коллаж успешно загружен в альбом "' + album.title + '"');
/*						
						Odnoklassniki.callRestApi('photos.addPhotoLike', function(result: Object): void {
							if (checkErrorData(result))
						}, Odnoklassniki.getSendObject({
							photo_id	: a_data[0]
						}));
*/						
					} else Odnoklassniki.showPermissions('PHOTO CONTENT', 'PUBLISH TO STREAM');
				}, serverURL, externalServer.viewer_id, album.aid, [
					{
						caption: collageObject?(getCollageLink(collageObject) + ' это мой коллаж на конкурсе "Лучший коллаж дня"​'):APPLINK,
						location: user.current_location
					}
				]);
			}
			
			
			Photos.getUploadUrl(function(a_data: Object): void {
				if (a_data.hasOwnProperty('error_code')) { // Нет доступа к альбому
					Odnoklassniki.showPermissions('PHOTO CONTENT', 'PUBLISH TO STREAM');
				} else {
					serverURL = a_data as String;
					if (a_JPGData) saveJPG(a_JPGData);
					else waitToSave(saveJPG, toAlbumSize, encodeFromJPG);
				}
			}, externalServer.viewer_id, album.aid);			
		}
		
		private function saveToMyAlbumOK(a_JPGData: ByteArray, collageObject: Object=null): void {
			checkMyAlbum(function(album: Object): void {
				_toSelectedAlbum(album, a_JPGData, collageObject);
			});
		}
		
		public function checkMyAlbum(doComplete: Function): void {
			function findAlbumName(albumName: String, findResult: Function): void {
				externalServer.getAlbums(externalServer.viewer_id, function(albums: Array): void {
					for (var i:int=0; i<albums.length; i++) {
						if (albums[i].title == albumName) {
							findResult(albums[i]);
							return;
						} 
					}
					findResult(null);
				}); 
			}
			
			findAlbumName(sitedata.MYALBUMNAME, function(f_album: Object): void {
				if (f_album) doComplete(f_album);
				else Photos.createAlbum(sitedata.MYALBUMNAME, 'friends', function(a_aid: String): void {
					doComplete({aid: a_aid})
				}, sitedata.MYALBUMDESC);
			});
		}
		
		override public function saveToAlbum(a_JPGData: ByteArray=null): void {
			var sa: clt_albums = selectAlbum(function(album: Object): void {
				sa.close();
				_toSelectedAlbum(album, a_JPGData);
			});
		}
		
		protected function doToAlbum(): void {
			saveToAlbum();
		}
		
		public function toStreamRecord(link: String, title: String, description: String, 
									   imageURL: String='clothing/ok/images/logo_50.jpg',
										linkCaption: String='Оценить коллаж'): void {
//			var link: String = 'http://www.odnoklassniki.ru/game/clothing?' + gameID;
//			var link: String = 'gid=' + gameID;
			Stream.publish(description, title, function(result: Object): void {
				if (checkErrorData(result)) trace(result);
			}, '', {
				caption: description,
				media:[
					{href: link, src: imageURL, type: "image"}
				]
			},
				[
					{"text":linkCaption, "href": link}
				]
			);
		}
		
		public function friendSelect(selectFunc: Function): se_friendsDialog {
			if (!_friendsDialog) {
				_friendsDialog = new se_friendsDialog(dialogLayer, 1, 'items', sitedata.MYBUTTONCAPTION, user);
			}
			_friendsDialog.showSelect(selectFunc);
			return _friendsDialog;
		}
		
		override protected function toNewGame(): void {
			toGameSend();
		}
		
		override public function publicGameCollage(collageData: Object, a_title: String, a_description: String): void {
			toStreamRecord(collageData.id, a_title, a_description);
			
			externalServer.getAppUsers(function(uids: Array): void {
				internalServer.oneQuery('sendNotify', uids.join(',') + ';' + 
					Utils.sprintf(sitedata.FRIENDGAMENOTIFY, se_util.userName(user)), 
				null, true);
			});
		}
		
		override protected function doCollageToGame(baimage: ByteArray, result: Object, isMyAlbum: Boolean = false): void {
			saveToMyAlbumOK(baimage, result);
			publicGameCollage(result, Utils.sex(user.sex, 'отправи-л,ла') + ' коллаж на конкурс', sitedata.GAMESTREAM);
//			toStreamGame(result.id);
			super.doCollageToGame(baimage, result, isMyAlbum);
			alert(locale.WARNING, sitedata.VOTEDOUBLETEXT, function(): void {
				workspace.dispatchEvent(new ObjectEvent(clt_events.VOTE2, result)); 
			}, true);
		}
		
		protected function doNewVictory(e: ObjectEvent): void {
			var list: Array = e.object as Array;
			list.forEach(function(item: Object, i:int, arr: Array): void {
				clt_victoryCollage.createFromTmpl(0, item.id, function(result: Bitmap): void {
					var vicWindow: clt_victoryWindow = new clt_victoryWindow(topLayer, sitedata.VICTORYTITLE, sitedata.VICTORYDESC, result);
					vicWindow.show();
				});
			});
		}
		
		protected function doAfterAddVote(e: ObjectEvent): void {
/*			
			Odnoklassniki.callRestApi('photos.addPhotoLike', function(a_data: Object): void {
			}, Odnoklassniki.getSendObject({
				photo_id	: e.object.pic
			}));
*/			
			toStreamRecord(e.object.id, Utils.sex(user.sex, 'оцени-л,ла коллаж на конкурсе'), 
							'Предлагаю и вам посмотреть этот коллаж!', 'clothing/ok/images/good.gif'); 
		}
		
		protected function doVoteDouble(e: ObjectEvent): void {
			Odnoklassniki.showPayment(sitedata.PAYDOUBLETITLE, sitedata.VOTEDOUBLEHELP, 
							e.object.id, DOUBLE_PRICE, null, null, null, 'true');
		}
		
		protected function doVoteMega(e: Event): void {
			Odnoklassniki.showPayment(sitedata.PAYMEGATITLE, sitedata.VOTEMEGAHELP2, 
							clt_data.SVID_VOTEMEGA.toString(), MEGA_PRICE, null, null, null, 'true');
		}

		override public function albumsPrepare(uid: String, albums: Array): Array {
			for (var i: int=0; i<albums.length; i++)
				albums[i].smallTitle = Utils.ll(albums[i].title?albums[i].title:albums[i].aid, 16);		
			return albums;
		}
		
		protected function afterRepeatPay(options: Object): void {
			toGameSend();
		}
		
		override protected function repeatGame(): void {
			alert(locale.WARNING, sitedata.REPEATGAMEDESC, function(): void {
				_payCallBack = afterRepeatPay;
				Odnoklassniki.showPayment(sitedata.REPEATGAMEPAY, '', 
							clt_data.SVID_REPEATGAME.toString(), REPEATGAME_PRICE, null, null, null, 'true');
			}, true);
		}
		
		protected function afterNoLinkPay(options: Object): void {
			user.noLinkText = true;
			workspace.dispatchEvent(new Event(clt_events.DISPLAYREFRESH));
		}
		
		override protected function doNoLinkRelease(e: Event): void {
			_payCallBack = afterNoLinkPay;
			Odnoklassniki.showPayment(sitedata.NOTEXTLINKPAYDESC, '', 
							clt_data.SVID_NOLINKTEXT.toString(), NOLINKTEXT_PRICE, null, null, null, 'true');
		}
		
		override protected function getStyles(): uif_styles {
			return new clt_styles();
		}
		
		override public function showInviteDialog(a_params: Object=null): void {
			Odnoklassniki.showInvite(sitedata.INVITEDESC, null, a_params as String);
			dispatchEvent(new ObjectEvent(clt_events.INVITE, {length: 1}))
		}
		
		public function doInviteShow(e: Event): void {
			showInviteDialog((e is ObjectEvent)?(e as ObjectEvent).object:null);
		}
		
		override protected function createExternalServer(): api_server {
			return new clt_okserver(this, _vars);
		}
		
		override protected function createInternalServer(): api_server {
			clt_myserver.MODEL_NAME = flashVars.MODEL_NAME?flashVars.MODEL_NAME:'cltok19';
			return new clt_myserver(this, clt_servers.MAIN_URL + '/games/index.php', _vars.api_id, SECRETS[_vars.api_id]);
		}
		
		override protected function doStikerClick(e: Event): void {
			vipStatusStart(sitedata.VIPSTATUSPREF2);		
		}
		
		protected function vipStatusStart(helpPref: String): void {
			alert(locale.WARNING, helpPref + sitedata.VIPSTATUSINFO, function(): void {
				_payCallBack = function(): void {
					setVipStatus(true);
				};
				Odnoklassniki.showPayment(sitedata.VIPSTATUCPAY, '', 
					clt_data.SVID_VIPSTATUS.toString(), VIPSTATUS_PRICE, null, null, null, 'true');
			}, true);
		}


		override protected function doMyDataComplete(a_data: Object): void {
			super.doMyDataComplete(a_data);
			if (!user.vipStatus) vipStatusStart(sitedata.VIPSTATUSPREF2);;
		}
		
		override public function checkVipStatus(_isVIPStatusFunc: Function): void {
			if (user.vipStatus) _isVIPStatusFunc();
			else vipStatusStart(sitedata.VIPSTATUSPREF1);
		}
	}
}